# 220206 651

# 高级索引
# NumPy 比一般的 Python 序列提供更多的索引方式
# 数组可以由整数数组索引、布尔索引及花式索引

import numpy as np

# 整数数组索引

a11 = np.array([[1,  2],  [3,  4],  [5,  6]])
print('a11=', a11, '\n', a11.shape) # (3, 2)

a13 = a11[[0,1,2], [0,1,0]]
print(type(a13)) # <class 'numpy.ndarray'>
print(a13, '\n', a13.shape) # (3,)

print('end.1')

# 获取了 4X3 数组中的四个角的元素
a20 = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])
print('a20=', a20, '\na20.shape=', a20.shape)

rows = np.array([[0,0], [3,3]])
cols = np.array([[0,2], [0,2]])
print('rows=', rows, ', type=', type(rows))
print('cols=', cols, ', type=', type(cols))

a29 = a20[rows, cols]
print('a29=', a29)
print(type(a29))

print('end.2')

# 借助切片 : 或 … 与索引数组组合

a37 = np.array([[1,2,3], [4,5,6],[7,8,9]])
a38 = a37[1:3, 1:3]
a39 = a37[1:3, [1,2]]
a40 = a37[..., 1:]
print('a37=', a37)
print(a38, '\n', a39, '\n', a40)

print('end.3')

# 布尔索引
# 通过一个布尔数组来索引目标数组
# 通过布尔运算（如：比较运算符）来获取符合指定条件的元素的数组

a50 = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])
print('a50=', a50)
print('>5:')
a53 = a50[a50 > 5]
print('a53=', a53)
print(type(a53)) # <class 'numpy.ndarray'>

# 使用了 ~（取补运算符）来过滤 NaN

a59 = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
a60 = a59[~np.isnan(a59)]
print('a59=', a59)
print('a60=', a60)

# 从数组中过滤掉 非复数元素

a66 = np.array([1, 2+6j, 5, 3.5+5j])
a67 = a66[np.iscomplex(a66)]
print('a67=', a66)
print('a67=', a67)

print('end.4')

# 花式索引
# 利用整数数组进行索引
# 引根据索引数组的值作为目标数组的某个轴的下标来取值
# 跟切片不一样，它总是将数据复制到新数组中

a78 = np.arange(32).reshape((8, 4))
a79 = a78[[4,2,1,7]] # 取 4 2 1 7 行
print('a78=', a78)
print('a79=', a79)
print(a79.shape) # (4, 4)

# 传入倒序索引数组

a86 = a78[[-4, -2, -1, -7]] # 两层中括号
print('a86=', a86)

# 传入多个索引数组（要使用np.ix_）

a91 = a78[np.ix_([1,5,7,2],[0,3,1,2])] # 行、列
print('a91=', a91)
# help(numpy.ix_)

print('end.5')
